home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / dev / c / vbcc.lha / vbcc / doc / vbccppc.doc < prev    next >
Text File  |  1998-01-31  |  7KB  |  198 lines

  1. vbcc - C compiler (c) in 1995-97 by Volker Barthelmann
  2.  
  3.  
  4. INTRODUCTION
  5.  
  6.     vbcc is a free portable and retargetable ANSI C compiler.
  7.     It is clearly split into a target independant and a target dependant
  8.     part and supports emulating datatypes of the target machine on any
  9.     other machine so that it is possible to e.g. make a crosscompiler for
  10.     a 64bit machine on a 32bit machine.
  11.     This document only deals with the target dependant parts of the
  12.     PowerPC version.
  13.  
  14.     This is a beta version!
  15.  
  16.  
  17. LEGAL
  18.  
  19.     vbcc is (c) in 1995-97 by Volker Barthelmann. All code is written by me
  20.     and may be freely redistributed as long as no modifications are made
  21.     and nothing is charged for it.
  22.     Non-commercial usage of vbcc is allowed without any restrictions.
  23.     Commercial usage needs my written consent.
  24.  
  25.     Sending me money, gifts, postcards etc. would of course be very nice
  26.     and may encourage further development of vbcc, but is not legally or
  27.     morally necessary to use vbcc.
  28.  
  29.  
  30. ADDITIONAL OPTIONS FOR THIS VERSION
  31.  
  32.     -merge-constants
  33.  
  34.                 Place identical floating point constants at the same
  35.                 memory location. This can reduce program size and increase
  36.                 compilation time.
  37.  
  38.     -const-in-data
  39.  
  40.                 By default constant data will be placed in the .rodata
  41.                 section. Using this option it will be placed in the data
  42.                 section.
  43.                 Note that on operating systems with memory protection this
  44.                 option will disable write-protection of constant data.
  45.  
  46.     -fsub-zero
  47.  
  48.                 Use fsub to load a floating-point-register with zero.
  49.                 This is faster but requires all registers to always contain
  50.                 valid values (i.e. no NaNs etc.) which may not be the case
  51.                 depending on startup-code, libraries etc.
  52.  
  53.     -amiga-align
  54.  
  55.                 Do not require any alignments greater than 2 bytes.
  56.                 This is needed when accessing Amiga system-structures, but
  57.                 can cause a performance penalty.
  58.  
  59.     -elf
  60.  
  61.                 Do not prefix symbols with '_'. Prefix labels with '.'.
  62.  
  63.     -no-regnames
  64.  
  65.                 Do not use register names but only numbers. This is necessary
  66.                 to avoid name-conflicts when using -elf.
  67.  
  68.     -setccs
  69.  
  70.                 The V.4 ABI requires that when varargs-functions are called
  71.                 with arguments passed in the floating-point registers this
  72.                 has to be signalled in a certain bit of the condition code
  73.                 register. vbcc usually doesn't make use of this and
  74.                 therefore does not care about that bit by default.
  75.                 This may lead to problems if you link objects compiled by
  76.                 vbcc to objects not compiled by vbcc (e.g. a different
  77.                 C-library) and call varargs-functions with floating-point
  78.                 arguments.
  79.                 In this case -setccs might help.
  80.  
  81.     -peephole
  82.  
  83.                 Perform several peephole optimizations. Currently includes:
  84.                  - better use of d16(r) addressing
  85.                  - use of indexed addressing modes
  86.                  - use of update-flag
  87.                  - use of record-flag
  88.                  - use of condition-code-registers to avoid certain branches
  89.  
  90.     -use-lmw
  91.  
  92.                 Use lmw/stmw-instructions. This can significantly reduce
  93.                 code-size. However these instructions may be slower on
  94.                 certain PPCs.
  95.  
  96.  
  97. SOME INTERNALS
  98.  
  99.     The current version generates assembly output for use with the "pasm"
  100.     assembler by Frank Wille. The generated code should work on 32bit systems
  101.     based on a PowerPC CPU using the V.4 ABI.
  102.  
  103.     The register names are:
  104.  
  105.         r0 through r31 for the general purpose registers,
  106.         f0 through f31 for the floating point registers and
  107.         cr0 through cr7 for the condition-code registers.
  108.  
  109.     The registers r0, r3-r12, f0-f13 and cr0-cr1 are used as scratch registers
  110.     (i.e. they can be destroyed in function calls), all other registers are
  111.     preserved. r1 is the stack-pointer and r13 is the small-data-pointer if
  112.     small-data-mode is used.
  113.  
  114.     The first 8 function arguments which have integer or pointer types
  115.     are passed in registers r3 through r10 and the first 8 floating-point
  116.     arguments are passed in registers f1 through f8. All other arguments
  117.     are passed on the stack.
  118.  
  119.     Integers and pointers are returned in r3, floats and doubles in f1.
  120.     All other types are returned by passing the function the address
  121.     of the result as a hidden argument - so when you call such a function
  122.     without a proper declaration in scope you can expect a crash.
  123.  
  124.     The elementary data types are represented like:
  125.  
  126.     type        size in bits        alignment in bytes (-amiga-align)
  127.  
  128.     char                8                       1 (1)
  129.     short              16                       2 (2)
  130.     int                32                       4 (2)
  131.     long               32                       4 (2)
  132.     all pointers       32                       4 (2)
  133.     float              32                       4 (2)
  134.     double             64                       8 (2)
  135.  
  136.  
  137. STDARG
  138.  
  139.     A possible <stdarg.h> could look like this:
  140.  
  141.     typedef struct {
  142.       int gpr;
  143.       int fpr;
  144.       char *regbase;
  145.       char *membase;
  146.     } va_list;
  147.  
  148.     char *__va_start(void);
  149.     char *__va_regbase(void);
  150.     int __va_fixedgpr(void);
  151.     int __va_fixedfpr(void);
  152.  
  153.     #define va_start(vl,dummy) \
  154.       ( \
  155.         vl.gpr=__va_fixedgpr(), \
  156.         vl.fpr=__va_fixedfpr(), \
  157.         vl.regbase=__va_regbase(), \
  158.         vl.membase=__va_start() \
  159.       )
  160.  
  161.     #define va_end(vl) (vl.regbase=vl.membase=0)
  162.  
  163.     #define __va_size(type) ((sizeof(type)+3)/4*4)
  164.     #define va_arg(vl,type) \
  165.       (__typeof(type)&15)>8? \
  166.         (vl.membase+=__va_size(type),((type*)vl.membase)[-1]) \
  167.       : \
  168.        ( \
  169.         (((__typeof(type)&15)==5||(__typeof(type)&15)==6)) ? \
  170.          ( \
  171.           ++vl.fpr<=8 ? \
  172.              ((double*)(vl.regbase+32))[vl.fpr] \
  173.           : \
  174.             (vl.membase+=__va_size(type),((type*)vl.membase)[-1]) \
  175.          ) \
  176.         : \
  177.          ( \
  178.           ++vl.gpr<=8 ? \
  179.             ((int*)(vl.regbase+0))[vl.gpr] \
  180.           : \
  181.             (vl.membase+=__va_size(type),((type*)vl.membase)[-1]) \
  182.          ) \
  183.        ) \
  184.  
  185.  
  186. KNOWN PROBLEMS
  187.  
  188.     - generated code is not very good
  189.     - nested function calls which pass parameters on the stack will not work
  190.     - composite types are put on the stack rather than passed via pointer
  191.     - indication of fp-register-args with bit 6 of cr is not done well
  192.  
  193.  
  194. Volker Barthelmann                                      volker@vb.franken.de
  195. Kennedy-Ring 39
  196. 91301 Forchheim
  197. Germany
  198.